//给你一个头结点为 head 的单链表和一个整数 k ，请你设计一个算法将链表分隔为 k 个连续的部分。 
//
// 每部分的长度应该尽可能的相等：任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 
//
// 这 k 个部分应该按照在链表中出现的顺序排列，并且排在前面的部分的长度应该大于或等于排在后面的长度。 
//
// 返回一个由上述 k 部分组成的数组。 
// 
//
// 示例 1： 
//
// 
//输入：head = [1,2,3], k = 5
//输出：[[1],[2],[3],[],[]]
//解释：
//第一个元素 output[0] 为 output[0].val = 1 ，output[0].next = null 。
//最后一个元素 output[4] 为 null ，但它作为 ListNode 的字符串表示是 [] 。
// 
//
// 示例 2： 
//
// 
//输入：head = [1,2,3,4,5,6,7,8,9,10], k = 3
//输出：[[1,2,3,4],[5,6,7],[8,9,10]]
//解释：
//输入被分成了几个连续的部分，并且每部分的长度相差不超过 1 。前面部分的长度大于等于后面部分的长度。
// 
//
// 
//
// 提示： 
//
// 
// 链表中节点的数目在范围 [0, 1000] 
// 0 <= Node.val <= 1000 
// 1 <= k <= 50 
// 
// Related Topics 链表 
// 👍 231 👎 0

package com.cute.leetcode.editor.cn;
public class SplitLinkedListInParts {
    public static void main(String[] args) {
        ListNode node9 = new ListNode(10);
        ListNode node8 = new ListNode(9,node9);
        ListNode node7 = new ListNode(8,node8);
        ListNode node6 = new ListNode(7,node7);
        ListNode node5 = new ListNode(6,node6);
        ListNode node4 = new ListNode(5,node5);
        ListNode node3 = new ListNode(4,node4);
        ListNode node2 = new ListNode(3,node3);
        ListNode node1 = new ListNode(2,node2);
        ListNode head = new ListNode(1,node1);
        new SplitLinkedListInParts().new Solution().splitListToParts(head, 3);
    }
    public static class ListNode {
     int val;
     ListNode next;
     ListNode() {}
     ListNode(int val) { this.val = val; }
     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  }
    //leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode[] splitListToParts(ListNode head, int k) {
        /**
         * 我的思路，先统计节点的个数n，然后与k进行比较，如果k>=n就简单了
         * 如果k<n，那就进行具体判断，开始节点倒是好说，结束的位置是真难整
         * 我的办法依旧很麻烦，相当于每次都新建了一个临时的链表
         */
        ListNode[] res = new ListNode[k];
        int n = 0;
        ListNode p = head;
        while (p!=null){//统计节点个数
            n++;
            p = p.next;
        }
        p = head;
        if (n<=k){
            for (int i = 0; i < k; i++) {
                if (i< n){
                    res[i] = p;
                    p = p.next;
                    res[i].next = null;
                }else res[i] = null;
            }
        }else {
            int i = n/k;//i是每组均分到的个数
            int j = n%k;//j是余数，一定比k要小，k的前j个有i+1个节点，剩余的都是i个节点
            //ListNode tempHead = new ListNode(p.val);//新建链表头结点
            //ListNode tempP = tempHead;//为链表添加节点用
            ListNode cur = null;
            for (int l = 0; l < k; l++) {
                ///res[l] = tempHead;//储存链表头结点
                res[l] = p;
                for (int m = 0; m < i-1 ; m++) {//因为开始时以及存了节点p的信息，所以这里遍历要少一次
                    p = p.next;
                    //tempP.next = new ListNode(p.val);
                    //tempP = tempP.next;
                }
                if (l < j){//这是为前几个小链表额外添加一个节点
                    p = p.next;
                    //tempP.next = new ListNode(p.val);
                    //tempP = tempP.next;
                }
                cur = p.next;
                p.next = null;
                p = cur;
                //p = p.next;//这里一定要跳到下一个位置，因为开始的时候会储存头部
                /*if (p!=null){//如果p==null，说明已经遍历完了，可以结束了
                    //tempHead = new ListNode(p.val);
                    //tempP = tempHead;
                }*/
            }
        }
        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}